package com.faya.green.service.impl;

import com.faya.green.abnormal.ServiceException;
import com.faya.green.common.Constant;
import com.faya.green.dao.user.UserDao;
import com.faya.green.dao.user.UserImgDao;
import com.faya.green.model.User;
import com.faya.green.model.UserImg;
import com.faya.green.service.UserImgService;
import com.faya.green.utils.CommonUtils;
import com.faya.green.utils.FileUtils;
import com.faya.green.utils.ImgUtils;
import com.faya.green.utils.PropertiesUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;

import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.UUID;

/**
 * @author ：LX
 * 创建时间： 2018/8/25. 1:21
 * 地点：广州
 * 目的: 用户图片合集
 * 备注说明：
 */
@Service
public class UserImgServiceImpl implements UserImgService {


    //压制全部警告
    @SuppressWarnings("all")
    @Autowired
    private UserImgDao userImgDao;
    //压制全部警告
    @SuppressWarnings("all")
    @Autowired
    private UserDao userDao;


    @Transactional(rollbackFor = Exception.class)
    @Override
    public void updateUserImg(UserImg userImg) {
        userImgDao.updateUserImg(userImg);
    }

    @Override
    public UserImg getUserImgById(String id) {
        return userImgDao.getUserImgById(id);
    }

    @Override
    public UserImg getUserImgByUrlAddr(String urlAddr) {
        return userImgDao.getUserImgByUrlAddr(urlAddr);
    }

    /**
     * 添加用户图片
     *  注意： 这里不处理事务，图片成功的就直接保存，否则不保存
     * @param userId 用户id
     * @param request
     */
    @Transactional(rollbackFor = Exception.class)
    @Override
    public void addImg(String userId, HttpServletRequest request) {
        User user = userDao.findUserById(userId);
        if (user == null){
            throw new ServiceException("用户不存在");
        }

        //大并发情况下有会有问题，sqlite在大并发情况下会发生锁的问题，SQLite只支持库级锁，这里的代码可以暂时去掉
        user.setIsImg(Constant.YES);
        userDao.updateUser(user);

        //利用MultipartHttpServletRequest来解析request中的文件
        MultipartHttpServletRequest multipartHttpServletRequest = (MultipartHttpServletRequest)request;
        //得到文件map对象，也可以直接 ultiRequest.getFiles("file");然后遍历这个files
        Map<String, MultipartFile> fileMap = multipartHttpServletRequest.getFileMap();

        //得到用户图片的基础路径
        String imgUserBase = PropertiesUtil.getConfigValue("imgUserBase");
        String logName = user.getLogName();
        String imgPath = imgUserBase + logName;
        FileUtils.init(imgPath);

        for (MultipartFile file : fileMap.values()){

            //获得图片文件名包括后缀
            String imgNameOld = file.getOriginalFilename();
            //获取后缀（总后开始找.获得下标）
            String prefix = imgNameOld.substring(imgNameOld.lastIndexOf(".") + 1);
            //转换为小写
            prefix = prefix.toLowerCase();
            //组成新的图片名
            String imgName = ImgUtils.newImgName();
            String name = imgName + "." + prefix;
            //组成路径 + 图片名 + 后缀的地址
            String img = imgPath + "\\" + name;

            try {
                file.transferTo(new File(img));
            } catch (IOException e) {
                e.printStackTrace();
            }

            UserImg userImg = new UserImg();
            userImg.setId(UUID.randomUUID().toString());
            userImg.setUrlAddr(name);
            userImg.setUserId(userId);
            userImg.setDescription(request.getParameter("description"));
            userImg.setImgName(request.getParameter("imgName"));
            userImg.setRemark(request.getParameter("remark"));

            userImg.setCreateTime(new Date());
            userImg.setUpdateTime(new Date());

            userImgDao.addUserImg(userImg);
        }

    }

    @Override
    public List<UserImg> getUserImgList(String userId) {
        return userImgDao.getUserImgList(userId);
    }

    @Transactional(rollbackFor = Exception.class)
    @Override
    public void delUserImg(String id) {
        //找到图片删除之
        UserImg userImg = userImgDao.getUserImgById(id);
        if (userImg != null){
            String userId = userImg.getUserId();
            if (!CommonUtils.checkNull(userId)){
                User user = userDao.findUserById(userId);
                if (user != null){
                    String urlAddr = userImg.getUrlAddr();
                    //得到用户图片的基础路径
                    String imgUserBase = PropertiesUtil.getConfigValue("imgUserBase");
                    String logName = user.getLogName();
                    //组成路径 + 图片名 + 后缀的地址
                    String img = imgUserBase + logName + "\\" + urlAddr;

                    FileUtils.delectFile(img);

                    List<UserImg> userImgList = userImgDao.getUserImgList(userId);
                    if (userImgList.size() == 0 || userImgList.size() == 1){
                        user.setIsImg(Constant.NO);
                        userDao.updateUser(user);
                    }
                }
            }

        }
        userImgDao.delUserImg(id);
    }
}
